home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / cbibcode.arc / HARDERR.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-08-05  |  2.0 KB  |  62 lines

  1. /* HARDERR.C --- p. 620 */
  2. #include <stdio.h>
  3. #include <dos.h>
  4.                 /* Prototype of our critical error handler */
  5. int harderror_handler(int, int, int, int);
  6. unsigned error_flag = 0;
  7. main()
  8. {
  9.     unsigned drivea = 1;
  10.     unsigned long total_space, free_space, bytes_per_cluster;
  11.     struct dfree dfinfo;
  12.                 /* Install our critical error handler */
  13.     harderr(harderror_handler);
  14.     printf("We will check our critical error handler.\n"
  15.         "Make sure drive A: is empty.  Hit any key to continue: ");
  16.     getch();
  17.                     /* Try an operation on drive A: */
  18.     getdfree(drivea, &dfinfo);
  19.             /* If error-flag is set, repeat call to getdfree */
  20.     while(error_flag)
  21.     {
  22.         error_flag = 0;
  23.         getdfree(drivea, &dfinfo);
  24.     }
  25.             /* Compute space statistics and display result */
  26.     bytes_per_cluster = dfinfo.df_sclus * dfinfo.df_bsec;
  27.     total_space = dfinfo.df_total * bytes_per_cluster;
  28.     free_space = dfinfo.df_avail * bytes_per_cluster;
  29.     printf("\n%ld bytes free out of %ld bytes of total space.\n",
  30.                         free_space, total_space);
  31. }
  32.                 /*-------------------------------------*/
  33.                 /* Critical error handler */
  34. #define DRIVE_NOT_READY  2
  35. #define HARDERR_ABORT    2
  36. int harderror_handler(int errorcode, int deverror, int bpval, int sival)
  37. {
  38.     unsigned far *devhdr;
  39.     char dletter;
  40.                     /* Set up pointer to device header */
  41.     devhdr = MK_FP((unsigned)bpval, (unsigned)sival);
  42.         /* Set a flag to let our program know about the error */
  43.     error_flag = 1;
  44.             /* Check if this is a "drive not ready" error */
  45.     if((errorcode & 0xff) == DRIVE_NOT_READY)
  46.     {
  47.         /* Find out which drive, it's in low byte of deverror */
  48.     dletter = 'A' + (deverror & 0xff);
  49.             /* Ask user to insert a diskette into the drive */
  50.     printf("\nDrive %c in not ready.\n"
  51.     "Please insert a diskette and hit any key to continue: ", dletter);
  52.     getch();            /* Read key before returning */
  53.             /* Use hardretn to go back to your program  */
  54.     hardretn(-1);
  55.     }
  56.     else
  57.     {
  58.             /* Unkown error, print message and abort program */
  59.     printf("Unknown critical error.  Aborting...\n");
  60.     hardresume(HARDERR_ABORT);
  61.     }
  62. }